Code coverage report for src/view-slot.js

Statements: 16.47% (28 / 170)      Branches: 0% (0 / 86)      Functions: 15% (6 / 40)      Lines: 16.67% (28 / 168)      Ignored: none     

All files » src/ » view-slot.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 3401     1   1   1   1   1   1     1 1                             1                                           1                                       1                     1                           1                         1                   1                                                   1                                                                             1                         1                                         1                       1                 1                       1                               1                                 1                                     1                                                   1     1        
System.register(['./content-selector', './animator', './util'], function (_export) {
  'use strict';
 
  var ContentSelector, Animator, nextElementSibling, ViewSlot;
 
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 
  return {
    setters: [function (_contentSelector) {
      ContentSelector = _contentSelector.ContentSelector;
    }, function (_animator) {
      Animator = _animator.Animator;
    }, function (_util) {
      nextElementSibling = _util.nextElementSibling;
    }],
    execute: function () {
      ViewSlot = (function () {
        function ViewSlot(anchor, anchorIsContainer, executionContext) {
          var animator = arguments[3] === undefined ? Animator.instance : arguments[3];
 
          _classCallCheck(this, ViewSlot);
 
          this.anchor = anchor;
          this.viewAddMethod = anchorIsContainer ? 'appendNodesTo' : 'insertNodesBefore';
          this.executionContext = executionContext;
          this.animator = animator;
          this.children = [];
          this.isBound = false;
          this.isAttached = false;
          anchor.viewSlot = this;
        }
 
        ViewSlot.prototype.transformChildNodesIntoView = function transformChildNodesIntoView() {
          var parent = this.anchor;
 
          this.children.push({
            fragment: parent,
            firstChild: parent.firstChild,
            lastChild: parent.lastChild,
            removeNodes: function removeNodes() {
              var last;
 
              while (last = parent.lastChild) {
                parent.removeChild(last);
              }
            },
            created: function created() {},
            bind: function bind() {},
            unbind: function unbind() {},
            attached: function attached() {},
            detached: function detached() {}
          });
        };
 
        ViewSlot.prototype.bind = function bind(executionContext) {
          var i, ii, children;
 
          if (this.isBound) {
            if (this.executionContext === executionContext) {
              return;
            }
 
            this.unbind();
          }
 
          this.isBound = true;
          this.executionContext = executionContext = executionContext || this.executionContext;
 
          children = this.children;
          for (i = 0, ii = children.length; i < ii; ++i) {
            children[i].bind(executionContext, true);
          }
        };
 
        ViewSlot.prototype.unbind = function unbind() {
          var i,
              ii,
              children = this.children;
          this.isBound = false;
 
          for (i = 0, ii = children.length; i < ii; ++i) {
            children[i].unbind();
          }
        };
 
        ViewSlot.prototype.add = function add(view) {
          view[this.viewAddMethod](this.anchor);
          this.children.push(view);
 
          if (this.isAttached) {
            view.attached();
            // Animate page itself
            var element = view.firstChild ? nextElementSibling(view.firstChild) : null;
            if (view.firstChild && view.firstChild.nodeType === 8 && element && element.nodeType === 1 && element.classList.contains('au-animate')) {
              this.animator.enter(element);
            }
          }
        };
 
        ViewSlot.prototype.insert = function insert(index, view) {
          if (index === 0 && !this.children.length || index >= this.children.length) {
            this.add(view);
          } else {
            view.insertNodesBefore(this.children[index].firstChild);
            this.children.splice(index, 0, view);
 
            if (this.isAttached) {
              view.attached();
            }
          }
        };
 
        ViewSlot.prototype.remove = function remove(view) {
          view.removeNodes();
 
          this.children.splice(this.children.indexOf(view), 1);
 
          if (this.isAttached) {
            view.detached();
          }
        };
 
        ViewSlot.prototype.removeAt = function removeAt(index) {
          var _this = this;
 
          var view = this.children[index];
 
          var removeAction = function removeAction() {
            view.removeNodes();
            _this.children.splice(index, 1);
 
            if (_this.isAttached) {
              view.detached();
            }
 
            return view;
          };
 
          var element = view.firstChild ? nextElementSibling(view.firstChild) : null;
          if (view.firstChild && view.firstChild.nodeType === 8 && element && element.nodeType === 1 && element.classList.contains('au-animate')) {
            return this.animator.leave(element).then(function () {
              return removeAction();
            });
          } else {
            return removeAction();
          }
        };
 
        ViewSlot.prototype.removeAll = function removeAll() {
          var _this2 = this;
 
          var children = this.children,
              ii = children.length,
              i;
 
          var rmPromises = [];
 
          children.forEach(function (child) {
            var element = child.firstChild ? nextElementSibling(child.firstChild) : null;
            if (child.firstChild && child.firstChild.nodeType === 8 && element && element.nodeType === 1 && element.classList.contains('au-animate')) {
              rmPromises.push(_this2.animator.leave(element).then(function () {
                child.removeNodes();
              }));
            } else {
              child.removeNodes();
            }
          });
 
          var removeAction = function removeAction() {
            if (_this2.isAttached) {
              for (i = 0; i < ii; ++i) {
                children[i].detached();
              }
            }
 
            _this2.children = [];
          };
 
          if (rmPromises.length > 0) {
            return Promise.all(rmPromises).then(function () {
              removeAction();
            });
          } else {
            removeAction();
          }
        };
 
        ViewSlot.prototype.swap = function swap(view) {
          var _this3 = this;
 
          var removeResponse = this.removeAll();
          if (removeResponse !== undefined) {
            removeResponse.then(function () {
              _this3.add(view);
            });
          } else {
            this.add(view);
          }
        };
 
        ViewSlot.prototype.attached = function attached() {
          var i, ii, children, child;
 
          if (this.isAttached) {
            return;
          }
 
          this.isAttached = true;
 
          children = this.children;
          for (i = 0, ii = children.length; i < ii; ++i) {
            child = children[i];
            child.attached();
 
            var element = child.firstChild ? nextElementSibling(child.firstChild) : null;
            if (child.firstChild && child.firstChild.nodeType === 8 && element && element.nodeType === 1 && element.classList.contains('au-animate')) {
              this.animator.enter(element);
            }
          }
        };
 
        ViewSlot.prototype.detached = function detached() {
          var i, ii, children;
 
          if (this.isAttached) {
            this.isAttached = false;
            children = this.children;
            for (i = 0, ii = children.length; i < ii; ++i) {
              children[i].detached();
            }
          }
        };
 
        ViewSlot.prototype.installContentSelectors = function installContentSelectors(contentSelectors) {
          this.contentSelectors = contentSelectors;
          this.add = this.contentSelectorAdd;
          this.insert = this.contentSelectorInsert;
          this.remove = this.contentSelectorRemove;
          this.removeAt = this.contentSelectorRemoveAt;
          this.removeAll = this.contentSelectorRemoveAll;
        };
 
        ViewSlot.prototype.contentSelectorAdd = function contentSelectorAdd(view) {
          ContentSelector.applySelectors(view, this.contentSelectors, function (contentSelector, group) {
            return contentSelector.add(group);
          });
 
          this.children.push(view);
 
          if (this.isAttached) {
            view.attached();
          }
        };
 
        ViewSlot.prototype.contentSelectorInsert = function contentSelectorInsert(index, view) {
          if (index === 0 && !this.children.length || index >= this.children.length) {
            this.add(view);
          } else {
            ContentSelector.applySelectors(view, this.contentSelectors, function (contentSelector, group) {
              return contentSelector.insert(index, group);
            });
 
            this.children.splice(index, 0, view);
 
            if (this.isAttached) {
              view.attached();
            }
          }
        };
 
        ViewSlot.prototype.contentSelectorRemove = function contentSelectorRemove(view) {
          var index = this.children.indexOf(view),
              contentSelectors = this.contentSelectors,
              i,
              ii;
 
          for (i = 0, ii = contentSelectors.length; i < ii; ++i) {
            contentSelectors[i].removeAt(index, view.fragment);
          }
 
          this.children.splice(index, 1);
 
          if (this.isAttached) {
            view.detached();
          }
        };
 
        ViewSlot.prototype.contentSelectorRemoveAt = function contentSelectorRemoveAt(index) {
          var view = this.children[index],
              contentSelectors = this.contentSelectors,
              i,
              ii;
 
          for (i = 0, ii = contentSelectors.length; i < ii; ++i) {
            contentSelectors[i].removeAt(index, view.fragment);
          }
 
          this.children.splice(index, 1);
 
          if (this.isAttached) {
            view.detached();
          }
 
          return view;
        };
 
        ViewSlot.prototype.contentSelectorRemoveAll = function contentSelectorRemoveAll() {
          var children = this.children,
              contentSelectors = this.contentSelectors,
              ii = children.length,
              jj = contentSelectors.length,
              i,
              j,
              view;
 
          for (i = 0; i < ii; ++i) {
            view = children[i];
 
            for (j = 0; j < jj; ++j) {
              contentSelectors[j].removeAt(i, view.fragment);
            }
          }
 
          if (this.isAttached) {
            for (i = 0; i < ii; ++i) {
              children[i].detached();
            }
          }
 
          this.children = [];
        };
 
        return ViewSlot;
      })();
 
      _export('ViewSlot', ViewSlot);
    }
  };
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL3RlbXBsYXRpbmcvc3JjL3ZpZXctc2xvdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7cURBSWEsUUFBUTs7Ozs7O3lDQUpiLGVBQWU7OzJCQUNmLFFBQVE7O2lDQUNSLGtCQUFrQjs7O0FBRWIsY0FBUTtBQUNSLGlCQURBLFFBQVEsQ0FDUCxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQTZCO2NBQTNCLFFBQVEsZ0NBQUMsUUFBUSxDQUFDLFFBQVE7O2dDQUR4RSxRQUFROztBQUVqQixjQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUNyQixjQUFJLENBQUMsYUFBYSxHQUFHLGlCQUFpQixHQUFHLGVBQWUsR0FBRyxtQkFBbUIsQ0FBQztBQUMvRSxjQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7QUFDekMsY0FBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7QUFDekIsY0FBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7QUFDbkIsY0FBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7QUFDckIsY0FBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7QUFDeEIsZ0JBQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1NBQ3hCOztBQVZVLGdCQUFRLFdBWW5CLDJCQUEyQixHQUFBLHVDQUFFO0FBQzNCLGNBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7O0FBRXpCLGNBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO0FBQ2pCLG9CQUFRLEVBQUMsTUFBTTtBQUNmLHNCQUFVLEVBQUMsTUFBTSxDQUFDLFVBQVU7QUFDNUIscUJBQVMsRUFBQyxNQUFNLENBQUMsU0FBUztBQUMxQix1QkFBVyxFQUFBLHVCQUFFO0FBQ1gsa0JBQUksSUFBSSxDQUFDOztBQUVULHFCQUFNLElBQUks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QUFFLEVBQUUsRUFBRSxDQUFDLEVBQUM7QUFDckIsc0JBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQzthQUN4QjtXQUNGOztBQUVELGNBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1NBQ3BCOztlQTlUVSxRQUFROzs7MEJBQVIsUUFBUSIsImZpbGUiOiIvVXNlcnMvRWlzZW5iZXJnRWZmZWN0L0RvY3VtZW50cy9HaXRIdWIvVGhlIER1cmFuZGFsIFByb2plY3QvYXVyZWxpYS90ZW1wbGF0aW5nL3NyYy92aWV3LXNsb3QuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbnRlbnRTZWxlY3Rvcn0gZnJvbSAnLi9jb250ZW50LXNlbGVjdG9yJztcbmltcG9ydCB7QW5pbWF0b3J9IGZyb20gJy4vYW5pbWF0b3InO1xuaW1wb3J0IHtuZXh0RWxlbWVudFNpYmxpbmd9IGZyb20gJy4vdXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBWaWV3U2xvdCB7XG4gIGNvbnN0cnVjdG9yKGFuY2hvciwgYW5jaG9ySXNDb250YWluZXIsIGV4ZWN1dGlvbkNvbnRleHQsIGFuaW1hdG9yPUFuaW1hdG9yLmluc3RhbmNlKXtcbiAgICB0aGlzLmFuY2hvciA9IGFuY2hvcjtcbiAgICB0aGlzLnZpZXdBZGRNZXRob2QgPSBhbmNob3JJc0NvbnRhaW5lciA/ICdhcHBlbmROb2Rlc1RvJyA6ICdpbnNlcnROb2Rlc0JlZm9yZSc7XG4gICAgdGhpcy5leGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgICB0aGlzLmFuaW1hdG9yID0gYW5pbWF0b3I7XG4gICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIHRoaXMuaXNCb3VuZCA9IGZhbHNlO1xuICAgIHRoaXMuaXNBdHRhY2hlZCA9IGZhbHNlO1xuICAgIGFuY2hvci52aWV3U2xvdCA9IHRoaXM7XG4gIH1cblxuICB0cmFuc2Zvcm1DaGlsZE5vZGVzSW50b1ZpZXcoKXtcbiAgICB2YXIgcGFyZW50ID0gdGhpcy5hbmNob3I7XG5cbiAgICB0aGlzLmNoaWxkcmVuLnB1c2goe1xuICAgICAgZnJhZ21lbnQ6cGFyZW50LFxuICAgICAgZmlyc3RDaGlsZDpwYXJlbnQuZmlyc3RDaGlsZCxcbiAgICAgIGxhc3RDaGlsZDpwYXJlbnQubGFzdENoaWxkLFxuICAgICAgcmVtb3ZlTm9kZXMoKXtcbiAgICAgICAgdmFyIGxhc3Q7XG5cbiAgICAgICAgd2hpbGUobGFzdCA9IHBhcmVudC5sYXN0Q2hpbGQpIHtcbiAgICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQobGFzdCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBjcmVhdGVkKCl7fSxcbiAgICAgIGJpbmQoKXt9LFxuICAgICAgdW5iaW5kKCl7fSxcbiAgICAgIGF0dGFjaGVkKCl7fSxcbiAgICAgIGRldGFjaGVkKCl7fVxuICAgIH0pO1xuICB9XG5cbiAgYmluZChleGVjdXRpb25Db250ZXh0KXtcbiAgICB2YXIgaSwgaWksIGNoaWxkcmVuO1xuXG4gICAgaWYodGhpcy5pc0JvdW5kKXtcbiAgICAgIGlmKHRoaXMuZXhlY3V0aW9uQ29udGV4dCA9PT0gZXhlY3V0aW9uQ29udGV4dCl7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy51bmJpbmQoKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzQm91bmQgPSB0cnVlO1xuICAgIHRoaXMuZXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0IHx8IHRoaXMuZXhlY3V0aW9uQ29udGV4dDtcblxuICAgIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjtcbiAgICBmb3IoaSA9IDAsIGlpID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgaWk7ICsraSl7XG4gICAgICBjaGlsZHJlbltpXS5iaW5kKGV4ZWN1dGlvbkNvbnRleHQsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHVuYmluZCgpe1xuICAgIHZhciBpLCBpaSwgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuICAgIHRoaXMuaXNCb3VuZCA9IGZhbHNlO1xuXG4gICAgZm9yKGkgPSAwLCBpaSA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGlpOyArK2kpe1xuICAgICAgY2hpbGRyZW5baV0udW5iaW5kKCk7XG4gICAgfVxuICB9XG5cbiAgYWRkKHZpZXcpe1xuICAgIHZpZXdbdGhpcy52aWV3QWRkTWV0aG9kXSh0aGlzLmFuY2hvcik7XG4gICAgdGhpcy5jaGlsZHJlbi5wdXNoKHZpZXcpO1xuXG4gICAgaWYodGhpcy5pc0F0dGFjaGVkKXtcbiAgICAgIHZpZXcuYXR0YWNoZWQoKTtcbiAgICAgIC8vIEFuaW1hdGUgcGFnZSBpdHNlbGZcbiAgICAgIHZhciBlbGVtZW50ID0gdmlldy5maXJzdENoaWxkID8gbmV4dEVsZW1lbnRTaWJsaW5nKHZpZXcuZmlyc3RDaGlsZCkgOiBudWxsO1xuICAgICAgaWYodmlldy5maXJzdENoaWxkICYmXG4gICAgICAgIHZpZXcuZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gOCAmJlxuICAgICAgICBlbGVtZW50ICYmXG4gICAgICAgIGVsZW1lbnQubm9kZVR5cGUgPT09IDEgJiZcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2F1LWFuaW1hdGUnKSkge1xuICAgICAgICB0aGlzLmFuaW1hdG9yLmVudGVyKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGluc2VydChpbmRleCwgdmlldyl7XG4gICAgaWYoKGluZGV4ID09PSAwICYmICF0aGlzLmNoaWxkcmVuLmxlbmd0aCkgfHwgaW5kZXggPj0gdGhpcy5jaGlsZHJlbi5sZW5ndGgpe1xuICAgICAgdGhpcy5hZGQodmlldyk7XG4gICAgfSBlbHNle1xuICAgICAgdmlldy5pbnNlcnROb2Rlc0JlZm9yZSh0aGlzLmNoaWxkcmVuW2luZGV4XS5maXJzdENoaWxkKTtcbiAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAwLCB2aWV3KTtcblxuICAgICAgaWYodGhpcy5pc0F0dGFjaGVkKXtcbiAgICAgICAgdmlldy5hdHRhY2hlZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlbW92ZSh2aWV3KXtcbiAgICB2aWV3LnJlbW92ZU5vZGVzKCk7XG5cbiAgICB0aGlzLmNoaWxkcmVuLnNwbGljZSh0aGlzLmNoaWxkcmVuLmluZGV4T2YodmlldyksIDEpO1xuXG4gICAgaWYodGhpcy5pc0F0dGFjaGVkKXtcbiAgICAgIHZpZXcuZGV0YWNoZWQoKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVBdChpbmRleCl7XG4gICAgdmFyIHZpZXcgPSB0aGlzLmNoaWxkcmVuW2luZGV4XTtcblxuICAgIHZhciByZW1vdmVBY3Rpb24gPSAoKSA9PiB7XG4gICAgICB2aWV3LnJlbW92ZU5vZGVzKCk7XG4gICAgICB0aGlzLmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgIGlmKHRoaXMuaXNBdHRhY2hlZCl7XG4gICAgICAgIHZpZXcuZGV0YWNoZWQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZpZXc7XG4gICAgfTtcblxuICAgIHZhciBlbGVtZW50ID0gdmlldy5maXJzdENoaWxkID8gbmV4dEVsZW1lbnRTaWJsaW5nKHZpZXcuZmlyc3RDaGlsZCkgOiBudWxsO1xuICAgIGlmKHZpZXcuZmlyc3RDaGlsZCAmJlxuICAgICAgdmlldy5maXJzdENoaWxkLm5vZGVUeXBlID09PSA4ICYmXG4gICAgICBlbGVtZW50ICYmXG4gICAgICBlbGVtZW50Lm5vZGVUeXBlID09PSAxICYmXG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnYXUtYW5pbWF0ZScpKSB7XG4gICAgICByZXR1cm4gdGhpcy5hbmltYXRvci5sZWF2ZShlbGVtZW50KS50aGVuKCAoKSA9PiB7XG4gICAgICAgIHJldHVybiByZW1vdmVBY3Rpb24oKTtcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZW1vdmVBY3Rpb24oKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVBbGwoKXtcbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuLFxuICAgICAgICBpaSA9IGNoaWxkcmVuLmxlbmd0aCxcbiAgICAgICAgaTtcblxuICAgIHZhciBybVByb21pc2VzID0gW107XG5cbiAgICBjaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgIHZhciBlbGVtZW50ID0gY2hpbGQuZmlyc3RDaGlsZCA/IG5leHRFbGVtZW50U2libGluZyhjaGlsZC5maXJzdENoaWxkKSA6IG51bGw7XG4gICAgICBpZihjaGlsZC5maXJzdENoaWxkICYmXG4gICAgICAgICBjaGlsZC5maXJzdENoaWxkLm5vZGVUeXBlID09PSA4ICYmXG4gICAgICAgICBlbGVtZW50ICYmXG4gICAgICAgICBlbGVtZW50Lm5vZGVUeXBlID09PSAxICYmXG4gICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnYXUtYW5pbWF0ZScpKSB7XG4gICAgICAgIHJtUHJvbWlzZXMucHVzaCh0aGlzLmFuaW1hdG9yLmxlYXZlKGVsZW1lbnQpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGNoaWxkLnJlbW92ZU5vZGVzKCk7XG4gICAgICAgIH0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoaWxkLnJlbW92ZU5vZGVzKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB2YXIgcmVtb3ZlQWN0aW9uID0gKCkgPT4ge1xuICAgICAgaWYodGhpcy5pc0F0dGFjaGVkKXtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgaWk7ICsraSl7XG4gICAgICAgICAgY2hpbGRyZW5baV0uZGV0YWNoZWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgfTtcblxuICAgIGlmKHJtUHJvbWlzZXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHJtUHJvbWlzZXMpLnRoZW4oKCkgPT4ge1xuICAgICAgICByZW1vdmVBY3Rpb24oKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZW1vdmVBY3Rpb24oKTtcbiAgICB9XG4gIH1cblxuICBzd2FwKHZpZXcpe1xuICAgIHZhciByZW1vdmVSZXNwb25zZSA9IHRoaXMucmVtb3ZlQWxsKCk7XG4gICAgaWYocmVtb3ZlUmVzcG9uc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVtb3ZlUmVzcG9uc2UudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuYWRkKHZpZXcpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkKHZpZXcpO1xuICAgIH1cbiAgfVxuXG4gIGF0dGFjaGVkKCl7XG4gICAgdmFyIGksIGlpLCBjaGlsZHJlbiwgY2hpbGQ7XG5cbiAgICBpZih0aGlzLmlzQXR0YWNoZWQpe1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNBdHRhY2hlZCA9IHRydWU7XG5cbiAgICBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XG4gICAgZm9yKGkgPSAwLCBpaSA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGlpOyArK2kpe1xuICAgICAgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIGNoaWxkLmF0dGFjaGVkKCk7XG5cbiAgICAgIHZhciBlbGVtZW50ID0gY2hpbGQuZmlyc3RDaGlsZCA/IG5leHRFbGVtZW50U2libGluZyhjaGlsZC5maXJzdENoaWxkKSA6IG51bGw7XG4gICAgICBpZihjaGlsZC5maXJzdENoaWxkICYmXG4gICAgICAgIGNoaWxkLmZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IDggJiZcbiAgICAgICAgIGVsZW1lbnQgJiZcbiAgICAgICAgIGVsZW1lbnQubm9kZVR5cGUgPT09IDEgJiZcbiAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdhdS1hbmltYXRlJykpIHtcbiAgICAgICAgdGhpcy5hbmltYXRvci5lbnRlcihlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBkZXRhY2hlZCgpe1xuICAgIHZhciBpLCBpaSwgY2hpbGRyZW47XG5cbiAgICBpZih0aGlzLmlzQXR0YWNoZWQpe1xuICAgICAgdGhpcy5pc0F0dGFjaGVkID0gZmFsc2U7XG4gICAgICBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XG4gICAgICBmb3IoaSA9IDAsIGlpID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgaWk7ICsraSl7XG4gICAgICAgIGNoaWxkcmVuW2ldLmRldGFjaGVkKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaW5zdGFsbENvbnRlbnRTZWxlY3RvcnMoY29udGVudFNlbGVjdG9ycyl7XG4gICAgdGhpcy5jb250ZW50U2VsZWN0b3JzID0gY29udGVudFNlbGVjdG9ycztcbiAgICB0aGlzLmFkZCA9IHRoaXMuY29udGVudFNlbGVjdG9yQWRkO1xuICAgIHRoaXMuaW5zZXJ0ID0gdGhpcy5jb250ZW50U2VsZWN0b3JJbnNlcnQ7XG4gICAgdGhpcy5yZW1vdmUgPSB0aGlzLmNvbnRlbnRTZWxlY3RvclJlbW92ZTtcbiAgICB0aGlzLnJlbW92ZUF0ID0gdGhpcy5jb250ZW50U2VsZWN0b3JSZW1vdmVBdDtcbiAgICB0aGlzLnJlbW92ZUFsbCA9IHRoaXMuY29udGVudFNlbGVjdG9yUmVtb3ZlQWxsO1xuICB9XG5cbiAgY29udGVudFNlbGVjdG9yQWRkKHZpZXcpe1xuICAgIENvbnRlbnRTZWxlY3Rvci5hcHBseVNlbGVjdG9ycyhcbiAgICAgIHZpZXcsXG4gICAgICB0aGlzLmNvbnRlbnRTZWxlY3RvcnMsXG4gICAgICAoY29udGVudFNlbGVjdG9yLCBncm91cCkgPT4gY29udGVudFNlbGVjdG9yLmFkZChncm91cClcbiAgICAgICk7XG5cbiAgICB0aGlzLmNoaWxkcmVuLnB1c2godmlldyk7XG5cbiAgICBpZih0aGlzLmlzQXR0YWNoZWQpe1xuICAgICAgdmlldy5hdHRhY2hlZCgpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnRlbnRTZWxlY3Rvckluc2VydChpbmRleCwgdmlldyl7XG4gICAgaWYoKGluZGV4ID09PSAwICYmICF0aGlzLmNoaWxkcmVuLmxlbmd0aCkgfHwgaW5kZXggPj0gdGhpcy5jaGlsZHJlbi5sZW5ndGgpe1xuICAgICAgdGhpcy5hZGQodmlldyk7XG4gICAgfSBlbHNle1xuICAgICAgQ29udGVudFNlbGVjdG9yLmFwcGx5U2VsZWN0b3JzKFxuICAgICAgICB2aWV3LFxuICAgICAgICB0aGlzLmNvbnRlbnRTZWxlY3RvcnMsXG4gICAgICAgIChjb250ZW50U2VsZWN0b3IsIGdyb3VwKSA9PiBjb250ZW50U2VsZWN0b3IuaW5zZXJ0KGluZGV4LCBncm91cClcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAwLCB2aWV3KTtcblxuICAgICAgaWYodGhpcy5pc0F0dGFjaGVkKXtcbiAgICAgICAgdmlldy5hdHRhY2hlZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnRlbnRTZWxlY3RvclJlbW92ZSh2aWV3KXtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmNoaWxkcmVuLmluZGV4T2YodmlldyksXG4gICAgICAgIGNvbnRlbnRTZWxlY3RvcnMgPSB0aGlzLmNvbnRlbnRTZWxlY3RvcnMsXG4gICAgICAgIGksIGlpO1xuXG4gICAgZm9yKGkgPSAwLCBpaSA9IGNvbnRlbnRTZWxlY3RvcnMubGVuZ3RoOyBpIDwgaWk7ICsraSl7XG4gICAgICBjb250ZW50U2VsZWN0b3JzW2ldLnJlbW92ZUF0KGluZGV4LCB2aWV3LmZyYWdtZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICBpZih0aGlzLmlzQXR0YWNoZWQpe1xuICAgICAgdmlldy5kZXRhY2hlZCgpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnRlbnRTZWxlY3RvclJlbW92ZUF0KGluZGV4KXtcbiAgICB2YXIgdmlldyA9IHRoaXMuY2hpbGRyZW5baW5kZXhdLFxuICAgICAgICBjb250ZW50U2VsZWN0b3JzID0gdGhpcy5jb250ZW50U2VsZWN0b3JzLFxuICAgICAgICBpLCBpaTtcblxuICAgIGZvcihpID0gMCwgaWkgPSBjb250ZW50U2VsZWN0b3JzLmxlbmd0aDsgaSA8IGlpOyArK2kpe1xuICAgICAgY29udGVudFNlbGVjdG9yc1tpXS5yZW1vdmVBdChpbmRleCwgdmlldy5mcmFnbWVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgaWYodGhpcy5pc0F0dGFjaGVkKXtcbiAgICAgIHZpZXcuZGV0YWNoZWQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmlldztcbiAgfVxuXG4gIGNvbnRlbnRTZWxlY3RvclJlbW92ZUFsbCgpe1xuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4sXG4gICAgICAgIGNvbnRlbnRTZWxlY3RvcnMgPSB0aGlzLmNvbnRlbnRTZWxlY3RvcnMsXG4gICAgICAgIGlpID0gY2hpbGRyZW4ubGVuZ3RoLFxuICAgICAgICBqaiA9IGNvbnRlbnRTZWxlY3RvcnMubGVuZ3RoLFxuICAgICAgICBpLCBqLCB2aWV3O1xuXG4gICAgZm9yKGkgPSAwOyBpIDwgaWk7ICsraSl7XG4gICAgICB2aWV3ID0gY2hpbGRyZW5baV07XG5cbiAgICAgIGZvcihqID0gMDsgaiA8IGpqOyArK2ope1xuICAgICAgICBjb250ZW50U2VsZWN0b3JzW2pdLnJlbW92ZUF0KGksIHZpZXcuZnJhZ21lbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmKHRoaXMuaXNBdHRhY2hlZCl7XG4gICAgICBmb3IoaSA9IDA7IGkgPCBpaTsgKytpKXtcbiAgICAgICAgY2hpbGRyZW5baV0uZGV0YWNoZWQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gIH1cbn1cbiJdfQ==